#include <stdio.h>

// int main()
// {
//     int a = 0;
//     scanf("%d",&a);
//     printf("%d\n",a);
//     return 0;
// }



// int main()
// {
//     int i = 0;
//     int arr[10]={1,2,3,4,5,6,7,8,9,10};
//     for(i=0;i<=12;i++)
//     {
//         arr[i]=0;
//         printf("hehe\n");//死循环
//     }
//     return 0;
// }




// //模拟strcpy函数 这个多看下 理解指针 
// #include <assert.h>
// char* my_strcpy(char* dest,const char* src)//src是source的缩写,const修饰保护源文件
// {
//     char* ret = dest;
//     assert(src != NULL);
//     assert(dest != NULL);
//     while(*dest++ = *src++)
//     {
//         ;
//     }
//     return ret;
// }
// int main()
// {
//     char arr1[20]="xxxxxxxxxxxx";
//     char arr2[]="hello world";
//     printf("%s\n",my_strcpy(arr1,arr2));
//     return 0;
// }





// //写一个模拟strlen功能的函数
// #include <assert.h>
// int my_strlen(const char* str)
// {
//     int count = 0;
//     assert(str);
//     while(*str != '\0')
//     {
//         count++;
//         str++;
//     }
//     return count;
// }
// int main()
// {
//     char arr[] = "hello world";
//     int len = my_strlen(arr);
//     printf("%d\n",len);
//     return 0;
// }





// //输入三个数字来代表三角形的三条边，
// //先判断这三条边是否能构成三角形，若能再判断这个三角形是等腰、等边、还是普通三角形

// int main()
// {
//     int a = 0;
//     int b = 0;
//     int c = 0;
//     while(scanf("%d %d %d",&a,&b,&c) == 3)
//     {
//         if((a + b > c) && (a + c > b) && (b + c > a))
//         {
//             if(a == b && b == c)
//                 printf("Equilateral triangle\n");
//             else if(a == b || b == c || a == c)
//                 printf("Isosceles triangle\n");
//             else
//                 printf("Ordinary triangel\n");
//         }
//         else
//             printf("not a triangle\n");
//     }
//     return 0;
// }



// //指针课后作业
// //short*类型的指针 每次访问两个字节 
// //写一个函数，打印数组arr的内容，不使用数组下标，使用指针
// void print(int* p,int sz)
// {
//     int i = 0;
//     for(i = 0;i < sz;i++)
//     {
//         printf("%d ",*(p + i));
//     }
//     printf("\n");
// }
// int main()
// {
//     int arr[] = {1,2,3,4,5,6,7,8,9,10};
//     int sz = sizeof(arr) / sizeof(arr[0]);
//     print(arr,sz);
//     return 0;
// }




// //字符串逆序
// #include <stdio.h>
// #include <string.h>
// int main()
// {
//     char arr[10001]={0};
//     //scanf("%s",arr);//应该用fgets（arr），scanf遇到空格会结束
//     // fgets(arr,sizeof(arr),stdin);
//     // //会读取换行符
//     gets(arr);//gets不会读取换行符，但已不推荐使用了
//     int left = 0;
//     int right = strlen(arr)-1;
//     while(left < right)
//     {
//         char temp = arr[left];
//         arr[left] = arr[right];
//         arr[right] = temp;
//         left++;
//         right--;
//     }
//     printf("%s\n",arr);
//     return 0;
// }




// //求sn = a + aa + aaa + aaaa + aaaaa的前n项之和，其中a是一个数字
// int main()
// {
//     int a = 0;
//     int n =0;
//     scanf("%d %d",&a,&n);
//     int sum = 0;
//     int k = 0;
//     int i = 0; 
//     for(i = 0 ;i < n;i++)
//     {
//         k = k*10 + a;
//         sum += k;
//     }
//     printf("%d\n",sum);
//     return 0;
// }





//求出0-100000之间所有的“水仙花数”并输出
//水仙花数是指一个n位数，其各位数字的n次方之和正好等于该数本身
#include <math.h>
//分情况讨论，代码过于负责
// int main()
// {
//     int i = 0;
//     for(i = 0;i < 10;i++)
//     {
//         if(pow(i,1) == i)
//         {
//             printf("%d ",i);
//         }
//     }
//     for(i = 10;i < 100;i++)
//     {
//         if(i == pow(i%10,2) + pow(i/10,2))
//         {
//             printf("%d ",i);
//         }
//     }
//     for(i = 100;i < 1000;i++)
//     {
//         if(i == pow(i%10,3) + pow((i/10)%10,3) +pow(i/100,3))
//         {
//             printf("%d ",i);
//         }
//     }
//     for(i = 1000;i < 10000;i++)
//     {
//         if(i == pow(i%10,4) + pow((i/10)%10,4) + pow((i/100)%10,4) + pow(i/1000,4))
//         {
//             printf("%d ",i);
//         }
//     }
//     for(i = 10000;i < 100000;i++)
//     {
//         if(i == pow(i%10,5) + pow((i/10)%10,5) + pow((i/100)%10,5) + pow((i/1000)%10,5)+pow(i/10000,5))
//         {
//             printf("%d ",i);
//         }
//     }
//     return 0;
// }

//不分情况
int cal(int i,int n)
{
    int j = 0;
    int sum = 0;
    for(j = 0;j < n;j++)
    {
        sum += pow(i%10,n);
        i /= 10;
    }
    return sum;
}
int main()
{
    int i = 0;
    for(i = 0;i <=100000;i++)
    {
        //先判断i是几位数，也可以封装成函数
        int n = 1;//至少是一位数
        int t = i;//不能改变循环变量本身
        while(t/10)
        {
            n++;
            t/=10;
        }
        int ret = cal(i,n);
        //也可不封装函数直接写
        //t = i;
        //while(t)
        //{
        //    sum += pow(t%10,n);
        //    t/= 10;
        //}
        if(ret == i)
        {
            printf("%d ",i);
        }
    }
    return 0;
}